//
//  IMSMultTableView.h
//  跨界收
//
//  Created by Allen on 2018/11/23.
//  Copyright © 2018年 gztx. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@protocol IMSMultTableViewDelegate,IMSMultTableViewDatasource;

typedef UITableViewCell IMSMultTableViewCell;

typedef UITableViewRowAnimation IMSMultTableViewRowAnimation;

typedef NS_ENUM(NSInteger, IMSMultTableViewCellEditingStyle) {
    IMSMultTableViewCellEditingStyleNone,
    IMSMultTableViewCellEditingStyleDelete,
    IMSMultTableViewCellEditingStyleInsert
};

@interface IMSMultTableView : UIView<UITableViewDelegate,UITableViewDataSource>


@property (nonatomic, strong, readonly) UITableView *tableView;

@property (nonatomic, assign, readwrite) id<IMSMultTableViewDatasource> datasource;

@property (nonatomic, assign, readwrite) id<IMSMultTableViewDelegate> delegate;


/**
 若为YES，则点开一行，其他行关闭,默认为YES
 */
@property (nonatomic, assign, readwrite) BOOL autoAdjustOpenAndClose;

/**
 预先打开的行数组
 */
@property (nonatomic, copy, readwrite) NSArray *openSectionArray;

@property (nonatomic, strong, readwrite) UIView *tableViewHeader;



/**
 *  Cell重用机制（一）
 *
 *   identifier Cell标识
 *
 *   Cell
 */
- (IMSMultTableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;

/**
 *  Cell重用机制（二）
 *
 *   identifier Cell标识
 *   indexPath
 *
 *   Cell
 */
- (IMSMultTableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier
                                              forIndexPath:(NSIndexPath *)indexPath;
/**
 *  刷新数据源
 */
- (void)reloadData;

/**
 *  注册cell（一）
 *
 *   nib
 *   identifier
 */
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier ;

/**
 *  注册cell（二）
 *
 *   cellClass
 *   identifier
 */
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier;

/**
 *  删除cell
 *
 *   indexPaths
 *   animation
 */
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

@end

/**
 *  数据源
 */
@protocol IMSMultTableViewDatasource <NSObject>

@required

/**
 *  每个section的行数
 *
 *   mTableView
 *   section
 *
 *   每个section的行数
 */
- (NSInteger)mTableView:(IMSMultTableView *)mTableView numberOfRowsInSection:(NSInteger)section;

/**
 *  Cell显示
 *
 *   mTableView
 *   indexPath
 *
 *   Cell
 */
- (IMSMultTableViewCell *)mTableView:(IMSMultTableView *)mTableView
              cellForRowAtIndexPath:(NSIndexPath *)indexPath;

@optional

/**
 *  section的数量
 *
 *   mTableView
 *
 *   section的数量
 */
- (NSInteger)numberOfSectionsInTableView:(IMSMultTableView *)mTableView;              // Default is 1

/**
 *  头部的title
 *
 *   tableView mTableView
 *   section   section
 *
 *
 */
-(NSString *)mTableView:(IMSMultTableView *)mTableView titleForHeaderInSection:(NSInteger)section;

//Edit

/**
 *  cell是否可以编辑
 *
 */
- (BOOL)mTableView:(IMSMultTableView *)mTableView canEditRowAtIndexPath:(NSIndexPath  *)indexPath;

/**
 *  cell编辑后回调
 *

 */
- (void)mTableView:(IMSMultTableView *)tableView commitEditingStyle:(IMSMultTableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

@end

/**
 *  代理
 */
@protocol IMSMultTableViewDelegate <NSObject>

@optional
/**
 *  每个Cell的高度
 *
 *   mTableView
 *   indexPath
 *
 *   每个Cell的高度
 */
- (CGFloat)mTableView:(IMSMultTableView *)mTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

/**
 *  每个section的高度
 *
 *   mTableView
 *   section
 *
 *   每个section的高度
 */
- (CGFloat)mTableView:(IMSMultTableView *)mTableView heightForHeaderInSection:(NSInteger)section;

/**
 *  section View
 *
 *   mTableView
 *   section
 *
 *   section View
 */
- (UIView *)mTableView:(IMSMultTableView *)mTableView viewForHeaderInSection:(NSInteger)section;

/**
 *  即将打开指定列表回调
 *
 *   mTableView
 *   section
 */
- (void)mTableView:(IMSMultTableView *)mTableView willOpenHeaderAtSection:(NSInteger)section;

/**
 *
 *  即将关闭列表回调
 *   mTableView
 *   section
 */
- (void)mTableView:(IMSMultTableView *)mTableView willCloseHeaderAtSection:(NSInteger)section;

/**
 *  点击Cell回调
 *
 *   mTableView
 *   indexPath
 */
- (void)mTableView:(IMSMultTableView *)mTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

//Edit

/**
 *
 *  设置cell的编辑类型
 *   mTableView
 *   indexPath
 *
 *
 */
- (IMSMultTableViewCellEditingStyle)mTableView:(IMSMultTableView *)mTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

/**
 *  设置cell编辑状态之删除的文本
 *
 *   mTableView
 *   indexPath
 
 *
 */
- (NSString *)mTableView:(IMSMultTableView *)mTableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath;


/**
 *  ...易拓展出你想要的tableview的功能，写法可以参照上面的定义
 */

@end
NS_ASSUME_NONNULL_END
